﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

// Обработчик двойного щелчка мыши, нажатия клавиши Enter или гиперссылки в табличном документе формы отчета.
// См. "Расширение поля формы для поля табличного документа.Выбор" в синтакс-помощнике.
//
// Параметры:
//   ФормаОтчета          - ФормаКлиентскогоПриложения - форма отчета.
//   Элемент              - ПолеФормы        - табличный документ.
//   Область              - ОбластьЯчеекТабличногоДокумента - выбранное значение.
//   СтандартнаяОбработка - Булево - признак выполнения стандартной обработки события.
//
Процедура ОбработкаВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка) Экспорт
	
	Если ФормаОтчета.НастройкиОтчета.ПолноеИмя = "Отчет.ДвиженияДокумента" Тогда
		
		Если Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник
			И ТипЗнч(Область.Расшифровка) = Тип("Структура") Тогда
			ОткрытьФормуРегистраИзОтчетаОДвижениях(ФормаОтчета, Область.Расшифровка, СтандартнаяОбработка);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Открывает форму регистра с отбором по регистратору
//
// Параметры:
//   ФормаОтчета      - ФормаКлиентскогоПриложения - форма отчета.
//   Расшифровка      - Структура:
//      * ВидРегистра - вид регистра "РегистрНакопления", "РегистрСведений", "РегистрБухгалтерии" или "РегистрРасчета".
//      * ИмяРегистра - имя регистра как объекта метаданных.
//      * Регистратор - ссылка на документ регистратор, по которому нужно сделать отбор
//                      в открывшейся форме регистра.
//   СтандартнаяОбработка - Булево  - признак выполнения стандартной (системной) обработки события.
//
Процедура ОткрытьФормуРегистраИзОтчетаОДвижениях(ФормаОтчета, Расшифровка, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	
	ПользовательскиеНастройки    = Новый ПользовательскиеНастройкиКомпоновкиДанных;
	Отбор                        = ПользовательскиеНастройки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
	ЭлементОтбора                = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(Расшифровка.ИмяПоляРегистратора);
	ЭлементОтбора.ПравоеЗначение = Расшифровка.Регистратор;
	ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.Использование  = Истина;
	
	ИмяФормыРегистра = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2.ФормаСписка",
		Расшифровка.ВидРегистра, Расшифровка.ИмяРегистра);
	
	ФормаРегистра = ПолучитьФорму(ИмяФормыРегистра);
	
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Поле",          Расшифровка.ИмяПоляРегистратора);
	ПараметрыОтбора.Вставить("Значение",      Расшифровка.Регистратор);
	ПараметрыОтбора.Вставить("ВидСравнения",  ВидСравненияКомпоновкиДанных.Равно);
	ПараметрыОтбора.Вставить("Использование", Истина);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ВПользовательскиеНастройки", Истина);
	ДополнительныеПараметры.Вставить("ЗаменятьСуществующий",       Истина);
	
	ДобавитьОтбор(ФормаРегистра.Список.КомпоновщикНастроек, ПараметрыОтбора, ДополнительныеПараметры);
	
	ФормаРегистра.Открыть();
	
КонецПроцедуры

// Добавляет отбор в коллекцию отборов компоновщика или группы отборов
//
// Параметры:
//   ЭлементСтруктуры        - КомпоновщикНастроекКомпоновкиДанных
//                           - НастройкиКомпоновкиДанных - элемент структуры КД
//   ПараметрыОтбора         - Структура - содержит параметры отбора компоновки данных:
//     * Поле                - Строка - имя поля, по которому добавляется отбор.
//     * Значение            - Произвольный - значение отбора КД (по умолчанию: Неопределено).
//     * ВидСравнения        - ВидСравненияКомпоновкиДанных - вид сравнений КД (по умолчанию: Неопределено).
//     * Использование       - Булево - признак использования отбора (по умолчанию: Истина).
//   ДополнительныеПараметры - Структура - содержит дополнительные параметры, перечисленные ниже:
//     * ВПользовательскиеНастройки - Булево - признак добавления в пользовательские настройки КД (по умолчанию: Ложь).
//     * ЗаменятьСуществующий       - Булево - признак полной замены существующего отбора по полю (по умолчанию: Истина).
//
// Возвращаемое значение:
//   ЭлементОтбораКомпоновкиДанных - добавленный отбор.
//
Функция ДобавитьОтбор(ЭлементСтруктуры, ПараметрыОтбора, ДополнительныеПараметры = Неопределено)
	
	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ВПользовательскиеНастройки", Ложь);
		ДополнительныеПараметры.Вставить("ЗаменятьСуществующий",       Истина);
	Иначе
		Если Не ДополнительныеПараметры.Свойство("ВПользовательскиеНастройки") Тогда
			ДополнительныеПараметры.Вставить("ВПользовательскиеНастройки", Ложь);
		КонецЕсли;
		Если Не ДополнительныеПараметры.Свойство("ЗаменятьСуществующий") Тогда
			ДополнительныеПараметры.Вставить("ЗаменятьСуществующий", Истина);
		КонецЕсли;
	КонецЕсли;
	
	Если ТипЗнч(ПараметрыОтбора.Поле) = Тип("Строка") Тогда
		НовоеПоле = Новый ПолеКомпоновкиДанных(ПараметрыОтбора.Поле);
	Иначе
		НовоеПоле = ПараметрыОтбора.Поле;
	КонецЕсли;
	
	ИдСуществующейПользовательскойНастройки = Неопределено;
	
	Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
		Отбор = ЭлементСтруктуры.Настройки.Отбор;
		
		Если ДополнительныеПараметры.ВПользовательскиеНастройки Тогда
			
			Для Каждого Элемент Из Отбор.Элементы Цикл
				Если Элемент.ЛевоеЗначение = НовоеПоле Тогда
					ИдСуществующейПользовательскойНастройки = Элемент.ИдентификаторПользовательскойНастройки;
					СуществующийОтбор = Элемент;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			
			Для Каждого ЭлементНастройки Из ЭлементСтруктуры.ПользовательскиеНастройки.Элементы Цикл
				Если ЭлементНастройки.ИдентификаторПользовательскойНастройки =
					ЭлементСтруктуры.Настройки.Отбор.ИдентификаторПользовательскойНастройки Тогда
					Отбор = ЭлементНастройки;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	
	ИначеЕсли ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиКомпоновкиДанных") Тогда
		Отбор = ЭлементСтруктуры.Отбор;
	Иначе
		Отбор = ЭлементСтруктуры;
	КонецЕсли;
	
	ЭлементОтбора = Неопределено;
	Если ДополнительныеПараметры.ЗаменятьСуществующий Тогда
		Для каждого Элемент Из Отбор.Элементы Цикл
	
			Если ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
				Продолжить;
			КонецЕсли;
	
			Если Элемент.ЛевоеЗначение = НовоеПоле Тогда
				ЭлементОтбора = Элемент;
			КонецЕсли;
	
		КонецЦикла;
		
		Если ИдСуществующейПользовательскойНастройки <> Неопределено Тогда
			ЭлементОтбора = СуществующийОтбор;
			Для Каждого Элемент Из ЭлементСтруктуры.ПользовательскиеНастройки.Элементы Цикл
				Если Элемент.ИдентификаторПользовательскойНастройки = ИдСуществующейПользовательскойНастройки Тогда
					Элемент.Использование  = ПараметрыОтбора.Использование;
					Элемент.ВидСравнения   = ?(ПараметрыОтбора.ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно,
						ПараметрыОтбора.ВидСравнения);
					Элемент.ПравоеЗначение = ПараметрыОтбора.Значение;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЭлементОтбора = Неопределено Тогда
		ЭлементОтбора = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	КонецЕсли;
	ЭлементОтбора.Использование  = ПараметрыОтбора.Использование;
	ЭлементОтбора.ЛевоеЗначение  = НовоеПоле;
	ЭлементОтбора.ВидСравнения   = ?(ПараметрыОтбора.ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно,
		ПараметрыОтбора.ВидСравнения);
	ЭлементОтбора.ПравоеЗначение = ПараметрыОтбора.Значение;
	
	Возврат ЭлементОтбора;
	
КонецФункции

#КонецОбласти